<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>FabGL: VGA/AnsiTerminal/AnsiTerminal.ino</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">FabGL
   </div>
   <div id="projectbrief">ESP32 Display Controller and Graphics Library</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('_v_g_a_2_ansi_terminal_2_ansi_terminal_8ino-example.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">VGA/AnsiTerminal/AnsiTerminal.ino</div>  </div>
</div><!--header-->
<div class="contents">
<p>Serial VT/ANSI Terminal</p>
<div class="fragment"><div class="line"> <span class="comment">/*</span></div><div class="line"><span class="comment">  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - www.fabgl.com</span></div><div class="line"><span class="comment">  Copyright (c) 2019-2020 Fabrizio Di Vittorio.</span></div><div class="line"><span class="comment">  All rights reserved.</span></div><div class="line"><span class="comment"></span></div><div class="line"><span class="comment">  This file is part of FabGL Library.</span></div><div class="line"><span class="comment"></span></div><div class="line"><span class="comment">  FabGL is free software: you can redistribute it and/or modify</span></div><div class="line"><span class="comment">  it under the terms of the GNU General Public License as published by</span></div><div class="line"><span class="comment">  the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><span class="comment">  (at your option) any later version.</span></div><div class="line"><span class="comment"></span></div><div class="line"><span class="comment">  FabGL is distributed in the hope that it will be useful,</span></div><div class="line"><span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div><div class="line"><span class="comment">  GNU General Public License for more details.</span></div><div class="line"><span class="comment"></span></div><div class="line"><span class="comment">  You should have received a copy of the GNU General Public License</span></div><div class="line"><span class="comment">  along with FabGL.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><span class="comment"> */</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="fabgl_8h.html">fabgl.h</a>&quot;</span></div><div class="line"></div><div class="line"></div><div class="line"><a name="_a0"></a><a class="code" href="classfabgl_1_1_bitmapped_display_controller.html">fabgl::BitmappedDisplayController</a> * DisplayController;</div><div class="line"><a name="_a1"></a><a class="code" href="classfabgl_1_1_p_s2_controller.html">fabgl::PS2Controller</a>                PS2Controller;</div><div class="line"><a name="_a2"></a><a class="code" href="classfabgl_1_1_terminal.html">fabgl::Terminal</a>                     Terminal;</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// notes about GPIO 2 and 12</span></div><div class="line"><span class="comment">//    - GPIO2:  may cause problem on programming. GPIO2 must also be either left unconnected/floating, or driven Low, in order to enter the serial bootloader.</span></div><div class="line"><span class="comment">//              In normal boot mode (GPIO0 high), GPIO2 is ignored.</span></div><div class="line"><span class="comment">//    - GPIO12: should be avoided. It selects flash voltage. To use it disable GPIO12 detection setting efuses with:</span></div><div class="line"><span class="comment">//                    python espefuse.py --port /dev/cu.SLAB_USBtoUART set_flash_voltage 3.3V</span></div><div class="line"><span class="comment">//                       WARN!! Good for ESP32 with 3.3V voltage (ESP-WROOM-32). This will BRICK your ESP32 if the flash isn&#39;t 3.3V</span></div><div class="line"><span class="comment">//                       NOTE1: replace &quot;/dev/cu.SLAB_USBtoUART&quot; with your serial port</span></div><div class="line"><span class="comment">//                       NOTE2: espefuse.py is downloadable from https://github.com/espressif/esptool</span></div><div class="line"><span class="preprocessor">#define UART_RX 34</span></div><div class="line"><span class="preprocessor">#define UART_TX 2</span></div><div class="line"></div><div class="line"><span class="preprocessor">#define RESET_PIN 12</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;confdialog.h&quot;</span></div><div class="line"></div><div class="line"></div><div class="line"><span class="keywordtype">void</span> setup()</div><div class="line">{</div><div class="line">  <span class="comment">//Serial.begin(115200); delay(500); Serial.write(&quot;\n\nReset\n\n&quot;); // DEBUG ONLY</span></div><div class="line"></div><div class="line">  <span class="comment">// more stack is required for the UI (used inside Terminal.onVirtualKey)</span></div><div class="line">  Terminal.<a name="a3"></a><a class="code" href="classfabgl_1_1_terminal_a77b40b81c5e1ba039ed39891bf8c6a20.html#a77b40b81c5e1ba039ed39891bf8c6a20">keyboardReaderTaskStackSize</a> = 3000;</div><div class="line"></div><div class="line">  Terminal.<a name="a4"></a><a class="code" href="classfabgl_1_1_terminal_a8508592f91c82a7a4a0c2edf4effce61.html#a8508592f91c82a7a4a0c2edf4effce61">inputQueueSize</a> = 2048; <span class="comment">// 2048 good to pass vttest</span></div><div class="line"></div><div class="line">  preferences.begin(<span class="stringliteral">&quot;AnsiTerminal&quot;</span>, <span class="keyword">false</span>);</div><div class="line"></div><div class="line">  ConfDialogApp::checkVersion();</div><div class="line"></div><div class="line">  pinMode(RESET_PIN, INPUT);</div><div class="line">  <span class="keywordflow">if</span> (digitalRead(RESET_PIN) == 1)</div><div class="line">    preferences.clear();</div><div class="line"></div><div class="line">  <span class="comment">// because mouse is optional, don&#39;t re-try if it is not found (to speed-up boot)</span></div><div class="line">  <a name="a5"></a><a class="code" href="classfabgl_1_1_mouse_afc85801bd90520c15ab4fe1004a45b02.html#afc85801bd90520c15ab4fe1004a45b02">fabgl::Mouse::quickCheckHardware</a>();</div><div class="line"></div><div class="line">  <span class="comment">// keyboard configured on port 0, and optionally mouse on port 1</span></div><div class="line">  PS2Controller.<a name="a6"></a><a class="code" href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">begin</a>(PS2Preset::KeyboardPort0_MousePort1);</div><div class="line"></div><div class="line">  ConfDialogApp::setupDisplay();</div><div class="line"></div><div class="line">  ConfDialogApp::loadConfiguration();  </div><div class="line"></div><div class="line">  <span class="comment">//Terminal.setLogStream(Serial);  // debug only</span></div><div class="line"></div><div class="line">  Terminal.<a name="a7"></a><a class="code" href="classfabgl_1_1_terminal_a2da678d7453efcfed190b99ac93a53d0.html#a2da678d7453efcfed190b99ac93a53d0">clear</a>();</div><div class="line">  Terminal.<a name="a8"></a><a class="code" href="classfabgl_1_1_terminal_aace245bfe6cab7b4339bd691077e1c23.html#aace245bfe6cab7b4339bd691077e1c23">enableCursor</a>(<span class="keyword">true</span>);</div><div class="line"></div><div class="line">  <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_ENABLED) {</div><div class="line">    Terminal.<a name="a9"></a><a class="code" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;* *  FabGL - Serial Terminal                            * *\r\n&quot;</span>);</div><div class="line">    Terminal.<a class="code" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;* *  2019-2020 by Fabrizio Di Vittorio - www.fabgl.com  * *\r\n\n&quot;</span>);</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Screen Size        : %d x %d\r\n&quot;</span>, DisplayController-&gt;<a name="a10"></a><a class="code" href="classfabgl_1_1_base_display_controller_a749df909b39fd096bf6e2813f2f5324c.html#a749df909b39fd096bf6e2813f2f5324c">getScreenWidth</a>(), DisplayController-&gt;<a name="a11"></a><a class="code" href="classfabgl_1_1_base_display_controller_a0872427e4a351bb3590e8d00096e9cba.html#a0872427e4a351bb3590e8d00096e9cba">getScreenHeight</a>());</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Terminal Size      : %d x %d\r\n&quot;</span>, Terminal.<a name="a12"></a><a class="code" href="classfabgl_1_1_terminal_a6e9094a53fd8a44ad7a061abae461e5c.html#a6e9094a53fd8a44ad7a061abae461e5c">getColumns</a>(), Terminal.<a name="a13"></a><a class="code" href="classfabgl_1_1_terminal_a1bb8ac2a73a5d9e6256505e1bf51c6a9.html#a1bb8ac2a73a5d9e6256505e1bf51c6a9">getRows</a>());</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Keyboard Layout    : %s\r\n&quot;</span>, PS2Controller.<a name="a14"></a><a class="code" href="classfabgl_1_1_p_s2_controller_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a name="a15"></a><a class="code" href="classfabgl_1_1_keyboard_aef1dd1399d92a09d1ed115911b563688.html#aef1dd1399d92a09d1ed115911b563688">isKeyboardAvailable</a>() ? SupportedLayouts::names()[ConfDialogApp::getKbdLayoutIndex()] : <span class="stringliteral">&quot;No Keyboard&quot;</span>);</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Mouse              : %s\r\n&quot;</span>, PS2Controller.<a name="a16"></a><a class="code" href="classfabgl_1_1_p_s2_controller_a2248eef1cd0e3b15957c08d6094926b6.html#a2248eef1cd0e3b15957c08d6094926b6">mouse</a>()-&gt;<a name="a17"></a><a class="code" href="classfabgl_1_1_mouse_a5c7f3389d06c1d96914e8a15eddc8864.html#a5c7f3389d06c1d96914e8a15eddc8864">isMouseAvailable</a>() ? <span class="stringliteral">&quot;Yes&quot;</span> : <span class="stringliteral">&quot;No&quot;</span>);</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Terminal Type      : %s\r\n&quot;</span>, SupportedTerminals::names()[(<span class="keywordtype">int</span>)ConfDialogApp::getTermType()]);</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Free Memory        : %d bytes\r\n&quot;</span>, heap_caps_get_free_size(MALLOC_CAP_32BIT));</div><div class="line">    Terminal.printf(<span class="stringliteral">&quot;Version            : %d.%d\r\n&quot;</span>, TERMVERSION_MAJ, TERMVERSION_MIN);</div><div class="line">    Terminal.<a class="code" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;\r\nPress F12 to change terminal configuration and CTRL-ALT-F12 to reset settings\r\n\n&quot;</span>);</div><div class="line">  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_TEMPDISABLED) {</div><div class="line">    preferences.putInt(<span class="stringliteral">&quot;BootInfo&quot;</span>, BOOTINFO_ENABLED);</div><div class="line">  }</div><div class="line"></div><div class="line">  <span class="comment">// onVirtualKey is triggered whenever a key is pressed or released</span></div><div class="line">  Terminal.<a name="a18"></a><a class="code" href="classfabgl_1_1_terminal_a41c6325db16da56b81f05e8d9dcabd0e.html#a41c6325db16da56b81f05e8d9dcabd0e">onVirtualKey</a> = [&amp;](<a name="a19"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#gad0e6e31d5953384be4ea987eb3923e02">VirtualKey</a> * vk, <span class="keywordtype">bool</span> keyDown) {</div><div class="line">    <span class="keywordflow">if</span> (*vk == <a name="a20"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a0587819039d24d9780c51ee62538e031">VirtualKey::VK_F12</a>) {</div><div class="line">      <span class="keywordflow">if</span> (!keyDown) {</div><div class="line"></div><div class="line">        <span class="comment">// releasing F12 key to open configuration dialog</span></div><div class="line">        Terminal.<a name="a21"></a><a class="code" href="classfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9.html#a8308b4bb6079733f4b77ced9d46da7a9">deactivate</a>();</div><div class="line">        PS2Controller.<a class="code" href="classfabgl_1_1_p_s2_controller_a2248eef1cd0e3b15957c08d6094926b6.html#a2248eef1cd0e3b15957c08d6094926b6">mouse</a>()-&gt;<a name="a22"></a><a class="code" href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">emptyQueue</a>();  <span class="comment">// avoid previous mouse movements to be showed on UI</span></div><div class="line">        <span class="keyword">auto</span> dlgApp = <span class="keyword">new</span> ConfDialogApp;</div><div class="line">        dlgApp-&gt;run(DisplayController);</div><div class="line">        <span class="keyword">auto</span> progToInstall = dlgApp-&gt;progToInstall;</div><div class="line">        <span class="keyword">delete</span> dlgApp;</div><div class="line">        Terminal.<a name="a23"></a><a class="code" href="classfabgl_1_1_terminal_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a name="a24"></a><a class="code" href="classfabgl_1_1_keyboard_aefe8cfbbb777abf28e87a1caf05da5e8.html#aefe8cfbbb777abf28e87a1caf05da5e8">emptyVirtualKeyQueue</a>();</div><div class="line">        Terminal.<a name="a25"></a><a class="code" href="classfabgl_1_1_terminal_aab6042247424cf6af1a4cda905b55b95.html#aab6042247424cf6af1a4cda905b55b95">activate</a>();</div><div class="line"></div><div class="line">        <span class="comment">// it has been requested to install a demo program?</span></div><div class="line">        <span class="keywordflow">if</span> (progToInstall &gt; -1)</div><div class="line">          installProgram(progToInstall);</div><div class="line"></div><div class="line">      } <span class="keywordflow">else</span> {</div><div class="line">        <span class="comment">// pressing CTRL + ALT + F12, reset parameters and reboot</span></div><div class="line">        <span class="keywordflow">if</span> ((Terminal.<a class="code" href="classfabgl_1_1_terminal_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a name="a26"></a><a class="code" href="classfabgl_1_1_keyboard_ad64abdda7b0ab92e15e23c602571e851.html#ad64abdda7b0ab92e15e23c602571e851">isVKDown</a>(<a name="a27"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a73ff5ebd60e7c43d4ca898dadd5c11da">VirtualKey::VK_LCTRL</a>) || Terminal.<a class="code" href="classfabgl_1_1_terminal_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a class="code" href="classfabgl_1_1_keyboard_ad64abdda7b0ab92e15e23c602571e851.html#ad64abdda7b0ab92e15e23c602571e851">isVKDown</a>(<a name="a28"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02ad018dacb0fce4c721676535638ea556b">VirtualKey::VK_RCTRL</a>)) &amp;&amp;</div><div class="line">            (Terminal.<a class="code" href="classfabgl_1_1_terminal_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a class="code" href="classfabgl_1_1_keyboard_ad64abdda7b0ab92e15e23c602571e851.html#ad64abdda7b0ab92e15e23c602571e851">isVKDown</a>(<a name="a29"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a5919ebddd3d85d4ca9055d9f0de2ea22">VirtualKey::VK_LALT</a>) || Terminal.<a class="code" href="classfabgl_1_1_terminal_ab7bbbedef758e471e6eb693acfb17c33.html#ab7bbbedef758e471e6eb693acfb17c33">keyboard</a>()-&gt;<a class="code" href="classfabgl_1_1_keyboard_ad64abdda7b0ab92e15e23c602571e851.html#ad64abdda7b0ab92e15e23c602571e851">isVKDown</a>(<a name="a30"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a364090d0560721d50a9c4c77fa268beb">VirtualKey::VK_RALT</a>))) {</div><div class="line">          Terminal.<a class="code" href="classfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9.html#a8308b4bb6079733f4b77ced9d46da7a9">deactivate</a>();</div><div class="line">          preferences.clear();</div><div class="line">          <span class="comment">// show reboot dialog</span></div><div class="line">          <span class="keyword">auto</span> rebootApp = <span class="keyword">new</span> RebootDialogApp;</div><div class="line">          rebootApp-&gt;run(DisplayController);</div><div class="line">        }</div><div class="line">      }</div><div class="line">      *vk = <a name="a31"></a><a class="code" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02acf5be65ce657a8918912d7751a8d6b06">VirtualKey::VK_NONE</a>;</div><div class="line">    }</div><div class="line">  };</div><div class="line"></div><div class="line">  <span class="comment">// onUserSequence is triggered whenever a User Sequence has been received (ESC + &#39;_#&#39; ... &#39;$&#39;), where &#39;...&#39; is sent here</span></div><div class="line">  Terminal.<a name="a32"></a><a class="code" href="classfabgl_1_1_terminal_af05ed15439143da3bc5b6b58d2e65daa.html#af05ed15439143da3bc5b6b58d2e65daa">onUserSequence</a> = [&amp;](<span class="keywordtype">char</span> <span class="keyword">const</span> * seq) {</div><div class="line">    <span class="comment">// &#39;R&#39;: change resolution (for example: ESC + &quot;_#R512x384x64$&quot;)</span></div><div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; RESOLUTIONS_COUNT; ++i)</div><div class="line">      <span class="keywordflow">if</span> (strcmp(RESOLUTIONS_CMDSTR[i], seq) == 0) {</div><div class="line">        <span class="comment">// found resolution string</span></div><div class="line">        preferences.putInt(<span class="stringliteral">&quot;TempResolution&quot;</span>, i);</div><div class="line">        <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_ENABLED)</div><div class="line">          preferences.putInt(<span class="stringliteral">&quot;BootInfo&quot;</span>, BOOTINFO_TEMPDISABLED);</div><div class="line">        ESP.restart();</div><div class="line">      }</div><div class="line">  };</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="keywordtype">void</span> loop()</div><div class="line">{</div><div class="line">  <span class="comment">// the job is done using UART interrupts</span></div><div class="line">  vTaskDelete(NULL);</div><div class="line">}</div></div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated on Wed Dec 9 2020 16:48:29 for FabGL by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  </ul>
</div>
</body>
</html>
